package com.qf.boot2302;

import com.qf.boot2302.entity.Car;
import com.qf.boot2302.entity.Student;
import com.qf.boot2302.entity.User;
import com.qf.boot2302.mapper.StudentMapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

/**
 * springboot项目的启动类
 * @SpringBootApplication 这个注解有什么作用？
 * 这个注解可以向IOC容器中添加Bean
 * Bean的来源有哪些呢？
 * - 我们自己写的controller，service
 * - 配置类中通过@Bean注解添加的
 * - starter依赖中引入的
 *
 *  @ComponentScan 扫描与启动类平级的包及其子包，把相关注解（@Service，@Controller，@Component）修饰的类添加到IOC容器中
 *  @Configuration 代表当前类是一个配置类，可以在这个类中添加@Bean注解修饰的方法，向IOC容器中添加bean
 *
 *  @EnableAutoConfiguration 开启springboot的自动装配机制。
 *  - 在starter依赖的jar包中，存在一个特殊的配置文件，文件的路径为: META-INF/spring.factoires
 *  - org.springframework.boot.autoconfigure.EnableAutoConfiguration 这个value部分存放了大量的自动配置类
 *  - 这个配置类中，如果满足相应条件，就会向IOC容器中添加bean
 *  - 哪些条件？例如，mq的自动配置类
 *  @ConditionalOnClass({ RabbitTemplate.class, Channel.class })
 *  这个注解代表，如果当前项目中引入的mq相关的jar包，RabbitTemplate类和Channel类都存在，则该配置类生效，否则无效。
 */
@SpringBootApplication  // 注意，启动类上一定要添加这个注解
@EnableConfigurationProperties(Car.class)
@ServletComponentScan
//@MapperScan(basePackages = "com.qf.boot2302.mapper")
public class Boot2302App {

//    @Autowired
//    User user03;

    public static void main(String[] args) {
        // 启动springboot项目的固定写法
        ConfigurableApplicationContext context = SpringApplication.run(Boot2302App.class, args);
//        StudentMapper studentMapper = context.getBean(StudentMapper.class);
//        Student stu = studentMapper.getbyid(1);
//        System.out.println(stu);
//        studentMapper.deleteColumn();
//        int beanDefinitionCount = context.getBeanDefinitionCount();
//        System.out.println(beanDefinitionCount);
//        String[] beanDefinitionNames = context.getBeanDefinitionNames();
//        for (String beanDefinitionName : beanDefinitionNames) {
//            System.out.println(beanDefinitionName);
//        }
//        User u1 = (User) context.getBean("user01");
//        User u2 = (User) context.getBean("user01");
//        System.out.println("u1:"+u1);
//        System.out.println("u2:"+u2);
//        System.out.println(u1==u2);
    }

//    @Bean
//    public User user03(){
//        return new User(3, "lisi");
//    }

}
